type Float
    native;  // float64

type NormalFloat
    protected Float;  // normal Float (excluding NaN and ±∞)


export function NormalFloat?:
    &(String) => Maybe[NormalFloat]
    native '__NormalFloatParse';

export function NormalFloat?: &(Float) => Maybe[NormalFloat]
    native '__FloatToMaybeNormalFloat';

export function !!!: &(Float) => NormalFloat
    &(x) => { !! { NormalFloat? x } };


export method NormalFloat.Integer: Integer  native '__NormalFloatToInteger';

export method Float.String: String          native '__FloatToString';
export method NormalFloat.String%0: String  native '__Percentage0';
export method NormalFloat.String%1: String  native '__Percentage1';
export method NormalFloat.String%2: String  native '__Percentage2';

export function =: &(NormalFloat,NormalFloat) => Bool  native '__FloatEqual';
export function <: &(NormalFloat,NormalFloat) => Bool  native '__FloatLessThan';

export function +: &(Float,Float) => Float  native '__Plus';
export function -: &(Float,Float) => Float  native '__Minus';
export function -: &(Float) => Float        native '__Negate';
export function *: &(Float,Float) => Float  native '__Mul';
export function /: &(Float,Float) => Float  native '__Quo';
export function %: &(Float,Float) => Float  native '__Rem';

export function **:    &(Float,Float) => Float  native '__Pow';
export function floor: &(Float) => Float        native '__Floor';
export function ceil:  &(Float) => Float        native '__Ceil';
export function round: &(Float) => Float        native '__Round';

export function sqrt: &(Float) => Float  native '__Sqrt';
export function cbrt: &(Float) => Float  native '__Cbrt';
export function  exp: &(Float) => Float  native '__Exp';
export function  log: &(Float) => Float  native '__Log';

export function  sin: &(Float) => Float  native '__Sin';
export function  cos: &(Float) => Float  native '__Cos';
export function  tan: &(Float) => Float  native '__Tan';
export function asin: &(Float) => Float  native '__Asin';
export function acos: &(Float) => Float  native '__Acos';
export function atan: &(Float) => Float  native '__Atan';

export function atan2: &({ y:Float, x:Float }) => Float
    native '__Atan2';


